package com.pengheng.controller;

import cn.hutool.core.util.RandomUtil;
import com.pengheng.entity.UserInfo;
import com.pengheng.model.ResultVo;
import com.pengheng.query.CommonQuery;
import com.pengheng.service.UserInfoService;
import com.pengheng.util.PageUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/user")
public class UserInfoController {


    @Autowired
    private UserInfoService userInfoService;

    @RequestMapping("/saveData")
    public String saveData(@RequestBody UserInfo userInfo) {
        userInfo.setId(RandomUtil.randomInt(Integer.MAX_VALUE));
        userInfoService.save(userInfo);
        return "sus";
    }

    ///  clickHouse 提供了 Delete 和 Update 的能力，这类操作被称为 Mutation 查询，它可以看做Alter 的一种。
    ///  虽然可以实现修改和删除，但是和一般的 OLTP 数据库不一样，Mutation 语句是一种很“重”的操作，而且不支持事务。
    ///  “重”的原因主要是每次修改或者删除都会导致放弃目标数据的原有分区,重建新分区所以尽量做批量的变更，不要进行频繁小数据的操作。
    ///  (1) 删除操作
    ///    alter table t order smt delete where sku id ='sku 001':
    ///  (2) 修改操作
    ///    alter table t order smt update !total amount=toDecimal32(2000.00,2) where id=102;
    ///  由于操作比较“重”，所以 Mutation 语句分两步执行，同步执行的部分其实只是进行新增数据新增分区和并把旧分区打上逻辑上的失效标记。直到触发分区合并的时候，才会删除旧数据释放磁盘空间，一般不会开放这样的功能给用户，由管理员完成。

    @RequestMapping("/updateData")
    public String updateData(@RequestBody UserInfo userInfo) {
        userInfoService.updateById(userInfo);
        return "sus";
    }

    @RequestMapping("/deleteById/{id}")
    public Boolean deleteById(@PathVariable("id") Integer id) {
//        return userInfoService.removeById(id);
        return userInfoService.deleteUserInfo(id);
    }

    @RequestMapping("/selectById/{id}")
    public UserInfo selectById(@PathVariable("id") Integer id) {
        return userInfoService.getById(id);
    }

    @RequestMapping("/selectList")
    public List<UserInfo> selectList() {
        return userInfoService.list();
    }

    @RequestMapping("/selectPage")
    public ResultVo<UserInfo> selectPage(@RequestBody CommonQuery commonQuery) {
        PageUtil.startPage(commonQuery);
        List<UserInfo> list = userInfoService.list();
        return ResultVo.page(list);
    }
}
